package com.hrt.serial.modbus;

/**
 * 串口数据帧对象，用于收集字节数据，并按组分解。 配合{@link ModbusDataDecode}，一起解析串口数据。
 * {@link ModbusDataDecode}负责粘包处理，{@link ModbusDataFrameDecoderBase}负责拆包处理
 * 核心方法是next
 * 
 * @author gislin
 */
public abstract class ModbusDataFrameDecoderBase {

    /**
     * 源数据
     */
    protected byte[] msg;
    /**
     * 调用next方法的时候，这个属性记录读取到哪个位置
     */
    protected int readedPosition = 0;

    public ModbusDataFrameDecoderBase() {
        super();
    }

    /**
     * 获取下一组数据，假如当前的数据中有多组数据的话，比如粘包的情况
     * 
     * @return
     */
    public abstract byte[] next();

    /**
     * 获取读剩下的数据
     * 
     * @return
     */
    public byte[] getLeftMsg() {

        int dataLength = msg.length - readedPosition;
        byte[] leftMsg = new byte[dataLength];

        System.arraycopy(msg, readedPosition, leftMsg, 0, dataLength);

        return leftMsg;

    }

}